/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package presentacion;

import Utiles.Utiles;
import dtos.DTODetalleProducto;
import dtos.DTODetalleServicio;
import dtos.DTOPedido;
import java.util.ArrayList;
import javax.swing.JDialog;
import javax.swing.JFrame;
import logicaNegocio.ExpertoRealizarPedido;
import logicaNegocio.ObservadorNotificacion;
import logicaNegocio.SuscriptorNotificacion;
import logicaNegocio.VariablesSesion;
import persistencia.agente.EstadoPedido;
import persistencia.agente.EstadoPedidoAgente;
import presentacion.models.TableModelDetalleProducto;
import presentacion.models.TableModelDetalleServicio;
import presentacion.models.TableModelProducto;
import presentacion.models.TableModelServicio;

/**
 *
 * @author Sebastian
 */
public class ControladorRealizarPedido implements ObservadorNotificacion {

    private int id;
    private ExpertoRealizarPedido expertoRealizarPedido;
    private String tituloVentanas;
    private TableModelDetalleProducto tableModelDetalleProducto;
    private TableModelDetalleServicio tableModelDetalleServicio;
    private TableModelProducto tableModelProducto;
    private TableModelServicio tableModelServicio;
    private IURealizarPedido iURealizarPedido;
    private IUProductos iUProductos;
    private IUServicios iUServicios;
    private IULoginPaciente iULoginPaciente;
    private IUMenuPaciente iUMenuPaciente;
    private DTOPedido dTOPedido;

    public ControladorRealizarPedido(String nombrePantalla, int idControlador) {
        expertoRealizarPedido = new ExpertoRealizarPedido();
        tituloVentanas = "Pantalla: " + nombrePantalla;
        id = idControlador;
        SuscriptorNotificacion.getInstancia().agregarObservador(this);
        iULoginPaciente = new IULoginPaciente(this);
        iULoginPaciente.setVisible(true);
    }

    public ControladorRealizarPedido() {
        expertoRealizarPedido = new ExpertoRealizarPedido();
    }

    private void inicializarTableModels() {
        tableModelDetalleProducto = new TableModelDetalleProducto();
        tableModelDetalleServicio = new TableModelDetalleServicio();
        tableModelProducto = new TableModelProducto();
        tableModelServicio = new TableModelServicio();
        tableModelDetalleProducto.refrescarTabla();
        tableModelDetalleServicio.refrescarTabla();

    }

    public void volverALogin() {
        getVentanaActiva().setVisible(false);
        setVentanaActiva(null);
        iULoginPaciente.setVisible(true);
        VariablesSesion.getInstancia().cerrarSesion(id);
        inicializarTableModels();
    }

    public void irAProducto() {
        new IUProductos(this);
    }

    public void irAServicio() {
        new IUServicios(this);
    }

    @Override
    public int getId() {
        return id;
    }

    @Override
    public void notificar(int idControlador, String mensaje) {

        if (idControlador == id) {
            JDialog noti = new JDialog(getVentanaActiva(), JDialog.ModalityType.DOCUMENT_MODAL);
            javax.swing.JTextArea tfMensaje = new javax.swing.JTextArea();
            noti.getContentPane().add(tfMensaje, java.awt.BorderLayout.CENTER);
            noti.setSize(375, 150);
            tfMensaje.setEditable(false);
            noti.add(tfMensaje);
            tfMensaje.setText(mensaje);
            noti.setTitle(tituloVentanas);
            noti.setVisible(true);
        }

    }

    private void setVentanaActiva(JFrame ventanaActiva) {
        VariablesSesion.getInstancia().getSesion(id).setVentanaActiva(ventanaActiva);
    }

    public void realizarPedido() {

        EstadoPedido estadoPedido = expertoRealizarPedido.obtenerEstadoPedido("Pendiente");
        if (estadoPedido == null) {
            getDTOPedido().setOidEstadoPedido(null);
        } else {
            getDTOPedido().setOidEstadoPedido(((EstadoPedidoAgente) estadoPedido).getOid());
        }
        getDTOPedido().setDtoDetallesProductos(tableModelDetalleProducto.getRows());
        getDTOPedido().setdTODetallesServicios(tableModelDetalleServicio.getRows());
        getDTOPedido().setNroFichaInternacion(VariablesSesion.getInstancia().getSesion(id).getNroFichaInternacion());

        java.awt.EventQueue.invokeLater(new Runnable() {

            public void run() {
                expertoRealizarPedido.realizarPedido(getDTOPedido(), id);
            }
        });

    }

    public TableModelDetalleProducto getTableModelDetalleProducto() {
        if (tableModelDetalleProducto == null) {
            tableModelDetalleProducto = new TableModelDetalleProducto();
        }

        return tableModelDetalleProducto;
    }

    public TableModelDetalleServicio getTableModelDetalleServicio() {
        if (tableModelDetalleServicio == null) {
            tableModelDetalleServicio = new TableModelDetalleServicio();
        }

        return tableModelDetalleServicio;
    }

    public TableModelProducto getTableModelProducto() {
        if (tableModelProducto == null) {
            tableModelProducto = new TableModelProducto();
        }
        return tableModelProducto;
    }

    public void setTableModelProducto(TableModelProducto tableModelProducto) {
        this.tableModelProducto = tableModelProducto;
    }

    public TableModelServicio getTableModelServicio() {
        if (tableModelServicio == null) {
            tableModelServicio = new TableModelServicio();
        }
        return tableModelServicio;
    }

    public void setTableModelServicio(TableModelServicio tableModelServicio) {
        this.tableModelServicio = tableModelServicio;
    }

    public void buscarProductosDisponibles() {
        tableModelProducto.setRows(expertoRealizarPedido.buscarProductosDisponibles());
    }

    public void buscarServiciosDisponibles() {
        tableModelServicio.setRows(expertoRealizarPedido.buscarServiciosDisponibles());
    }

    public void agregarProductos() {
        expertoRealizarPedido.agregarProductos(getDTOPedido(), tableModelProducto.getSelectedRows());
        tableModelDetalleProducto.setRows(getDTOPedido().getDtoDetallesProductos());
    }

    public void agregarServicios() {
        expertoRealizarPedido.agregarServicios(getDTOPedido(), tableModelServicio.getSelectedRows());
        tableModelDetalleServicio.setRows(getDTOPedido().getdTODetallesServicios());
    }

    private DTOPedido getDTOPedido() {
        if (dTOPedido == null) {
            dTOPedido = new DTOPedido();
            dTOPedido.setDtoDetallesProductos(new ArrayList<DTODetalleProducto>());
            dTOPedido.setdTODetallesServicios(new ArrayList<DTODetalleServicio>());
        }
        return dTOPedido;
    }

    public String getTituloVentana() {
        return tituloVentanas;
    }

    public int validarUsuaio(String usuario, String contrasenia) {
        int resultado = VariablesSesion.getInstancia().validarLogin(usuario, contrasenia, id);
        if (resultado == 0) {
            iULoginPaciente.setVisible(false);
            iUMenuPaciente = new IUMenuPaciente(this);
            iUMenuPaciente.setVisible(true);
            setVentanaActiva(iUMenuPaciente);
        }
        return resultado;
    }

    public void irARealizarPedido() {
        inicializarTableModels();
        dTOPedido = null;
        iUMenuPaciente.setVisible(false);
        getDTOPedido().setNroPedido(Utiles.obtenerNroPedido());
        iURealizarPedido = new IURealizarPedido(this, getDTOPedido().getNroPedido());
        getiURealizarPedido().setVisible(true);
        setVentanaActiva(getiURealizarPedido());
    }

    public void volverAMenuPaciente() {
        inicializarTableModels();
        getVentanaActiva().setVisible(false);
        getiURealizarPedido().setVisible(false);
        iUMenuPaciente.setVisible(true);
        setVentanaActiva(iUMenuPaciente);
    }

    public void confirmarPedido(DTOPedido dTOPedido) {
        expertoRealizarPedido.confirmarPedido(dTOPedido);
        dTOPedido = null;
    }

    private JFrame getVentanaActiva() {
        return VariablesSesion.getInstancia().getSesion(id).getVentanaActiva();
    }

    public void desbloquearTodo(DTOPedido pedido) {
        expertoRealizarPedido.desbloquearTodo(pedido);
    }

    public double recalcularTotal() {
        double resul = 0;
        if (dTOPedido != null) {
            dTOPedido.recalcularTotal();
            resul = dTOPedido.getImporteTotal();
        }
        return resul;
    }

    public IURealizarPedido getiURealizarPedido() {
        return iURealizarPedido;
    }
}